home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume16 / ecu3 / part10 < prev    next >
Encoding:
Internet Message Format  |  1991-01-06  |  52.5 KB

  1. From: wht@n4hgf.uucp (Warren Tucker)
  2. Newsgroups: comp.sources.misc
  3. Subject: v16i034:  ECU async comm package rev 3.0, Part10/35
  4. Message-ID: <1991Jan6.052036.27742@sparky.IMD.Sterling.COM>
  5. Date: 6 Jan 91 05:20:36 GMT
  6. Approved: kent@sparky.imd.sterling.com
  7. X-Checksum-Snefru: dbad240a 09d77c6d 607c9ef8 270212b7
  8.  
  9. Submitted-by: wht@n4hgf.uucp (Warren Tucker)
  10. Posting-number: Volume 16, Issue 34
  11. Archive-name: ecu3/part10
  12.  
  13. ---- Cut Here and feed the following to sh ----
  14. #!/bin/sh
  15. # This is part 10 of ecu3
  16. if touch 2>&1 | fgrep 'amc' > /dev/null
  17.  then TOUCH=touch
  18.  else TOUCH=true
  19. fi
  20. # ============= ecuxfer.c ==============
  21. echo 'x - extracting ecuxfer.c (Text)'
  22. sed 's/^X//' << 'SHAR_EOF' > 'ecuxfer.c' &&
  23. X/*+-------------------------------------------------------------------------
  24. X    ecuxfer.c - file transfer
  25. X    wht@n4hgf.Mt-Park.GA.US
  26. X
  27. X   000000000011111111112222222222333333333344444444445555555555666666666actually
  28. X   012345678901234567890123456789012345678901234567890123456789012345678wider
  29. X00:.--[ Send ZMODEM/CRC32 ]--------------------------------------------.
  30. X01:|                                                                   |
  31. X02:|  File? to send:                                                   |
  32. X03:|  ................................................................ |
  33. X04:|                                                                   |
  34. X05:|  Binary: Y (no CR/LF translation)                                 |
  35. X06:|  Overwrite destination files: Y                                   |
  36. X07:|  Send full pathnames: N                                           |
  37. X08:|  Transfer only newer files: N (if receiver supports)              |
  38. X09:|                                                                   |
  39. X-1:| TAB:next  ^B:prev  END:perform transfer  ESC:abort                |
  40. X-0:`-------------------------------------------------------------------'
  41. X
  42. X  Defined functions:
  43. X    file_xfer_done_bell()
  44. X    file_xfer_start()
  45. X    receive_files_from_remote(argc,argv)
  46. X    report_send_status()
  47. X    send_files_to_remote(argc,argv)
  48. X    xfer_title_fragment()
  49. X    xfrw_bot_msg(msg)
  50. X    xfrw_display_cmd_line()
  51. X    xfrw_get_single(nondelim_list)
  52. X    xfrws_display_allvars()
  53. X    xfrws_display_binary()
  54. X    xfrws_display_literals()
  55. X    xfrws_display_name()
  56. X    xfrws_display_xfernew()
  57. X
  58. X--------------------------------------------------------------------------*/
  59. X/*+:EDITS:*/
  60. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  61. X
  62. X#include <curses.h>
  63. X
  64. X#define STDIO_H_INCLUDED
  65. X#define OMIT_TERMIO_REFERENCES
  66. X#include "ecu.h"
  67. X#include "ecukey.h"
  68. X#include "ecuxkey.h"
  69. X#include "ecuerror.h"
  70. X#include "pc_scr.h"
  71. X
  72. X#define END        XFend
  73. X
  74. X/* -- protocol xfer types -- */
  75. X#define ECUSZ_X            1
  76. X#define ECUSZ_Y            2
  77. X#define ECUSZ_Z            3
  78. X#define ECUSEA            4
  79. X#define CKERMIT            5
  80. X#define ECURZ_X            7
  81. X#define ECURZ_Y            8
  82. X#define ECURZ_Z            9
  83. X
  84. X/* --------------------- send window ----------------------------------- */
  85. X/*      SNDW_LINES            calculated (xfrw_lines) */
  86. X#define SNDW_COLS            79
  87. X#define SNDW_TLY            2
  88. X/*      SNDW_TLX            calculated (xfrw_tlx) */
  89. X
  90. X#define SNDW_FILE_LY        2
  91. X#define SNDW_FILE_LX        3
  92. X#define SNDW_FILE_Y            3
  93. X#define SNDW_FILE_X            3
  94. X#define SNDW_FILE_LEN        (SNDW_COLS - SNDW_FILE_X - 2)
  95. X
  96. X#define SNDW_BIN_Y            5
  97. X#define SNDW_BIN_LX            3
  98. X#define SNDW_BIN_X            11
  99. X#define SNDW_BIN_LX2        13
  100. X
  101. X#define SNDW_OVERW_Y        6
  102. X#define SNDW_OVERW_LX        3
  103. X#define SNDW_OVERW_X        32
  104. X
  105. X#define SNDW_SNDFUL_Y        7
  106. X#define SNDW_SNDFUL_LX        3
  107. X#define SNDW_SNDFUL_X        24
  108. X
  109. X#define SNDW_XFRNEW_Y        8
  110. X#define SNDW_XFRNEW_LX        3
  111. X#define SNDW_XFRNEW_X        30
  112. X
  113. X#define SNDW_ZWINDW_Y        9
  114. X#define SNDW_ZWINDW_LX        3
  115. X#define SNDW_ZWINDW_X        16
  116. X#define SNDW_ZWINDW_LEN        6
  117. X
  118. Xextern char curr_dir[];        /* current working directory */
  119. Xextern int protocol_log_packets;
  120. Xextern int last_child_wait_status;
  121. X
  122. Xlong file_xfer_start_time;    /* time() value at beginning of file xfer */
  123. Xchar xfertype = -1;        /* file xfer type */
  124. XWINDOW *xfrw;
  125. Xchar xfrw_cols;
  126. Xchar xfrw_lines;
  127. Xchar xfrw_tlx;
  128. X
  129. Xchar p_binary;        /* xfer options -- not all apply to all protocols */
  130. Xchar p_sendfull;
  131. Xchar p_overwrite;
  132. Xchar p_xfernew;
  133. Xchar p_filelist[80];
  134. Xint zwindw_size;
  135. X
  136. X/*+-------------------------------------------------------------------------
  137. X    file_xfer_start()
  138. X--------------------------------------------------------------------------*/
  139. Xvoid
  140. Xfile_xfer_start()
  141. X{
  142. X    time(&file_xfer_start_time);
  143. X}    /* end of file_xfer_start */
  144. X
  145. X/*+-------------------------------------------------------------------------
  146. X    file_xfer_done_bell()
  147. X--------------------------------------------------------------------------*/
  148. Xvoid
  149. Xfile_xfer_done_bell()
  150. X{
  151. Xlong time();
  152. Xlong xfer_time = time((long *)0) - file_xfer_start_time;
  153. Xint xbell_count = 0;
  154. Xextern int want_bell_notify;
  155. X
  156. X    sleep(1);
  157. X    xbell_count = 1;
  158. X    if(xfer_time >= 3600L)            /* >= one hour */
  159. X        xbell_count = 3;
  160. X    else if(xfer_time >= 1800L)        /* >= 1/2 hour */
  161. X        xbell_count = 2;
  162. X
  163. X    if(want_bell_notify)
  164. X        bell_notify(XBELL_ATTENTION);
  165. X
  166. X    xbell(XBELL_DONE,xbell_count);
  167. X}    /* end of file_xfer_done_bell */
  168. X
  169. X/*+-------------------------------------------------------------------------
  170. X    xfrw_bot_msg(msg)
  171. X--------------------------------------------------------------------------*/
  172. Xvoid
  173. Xxfrw_bot_msg(msg)
  174. Xchar *msg;
  175. X{
  176. Xregister itmp;
  177. Xregister itmp2;
  178. Xstatic last_msglen = 0;
  179. Xchar msg2[80];
  180. X
  181. X    wmove(xfrw,xfrw_lines - 1,3);
  182. X
  183. X    if((itmp = strlen(msg)) == 0)
  184. X    {
  185. X        itmp2 = last_msglen + 2;
  186. X        for(itmp = 0; itmp < itmp2; itmp++)
  187. X            waddch(xfrw,(unsigned)sHR);
  188. X        last_msglen = 0;
  189. X    }
  190. X    else
  191. X    {
  192. X        waddch(xfrw,' ');
  193. X        if(itmp > xfrw_cols - 3 - 2)
  194. X        {
  195. X            strncpy(msg2,msg,xfrw_cols - 3 - 2);
  196. X            msg2[xfrw_cols - 3 - 2 + 1] = 0;
  197. X            waddstr(xfrw,msg2);
  198. X            itmp = strlen(msg2);
  199. X        }
  200. X        else
  201. X        {
  202. X            waddstr(xfrw,msg);
  203. X            itmp = strlen(msg);
  204. X        }
  205. X        waddch(xfrw,' ');
  206. X        if((itmp2 = last_msglen - itmp) > 0)
  207. X        {
  208. X            while(itmp2--)
  209. X                waddch(xfrw,(unsigned)sHR);
  210. X        }
  211. X        last_msglen = itmp;        /* remember last message length */
  212. X    }
  213. X    wrefresh(xfrw);
  214. X}    /* end of xfrw_bot_msg */
  215. X
  216. X/*+-------------------------------------------------------------------------
  217. X    xfrw_get_single(nondelim_list)
  218. Xassumes cursor is already positioned
  219. X--------------------------------------------------------------------------*/
  220. Xint
  221. Xxfrw_get_single(nondelim_list)
  222. Xregister char *nondelim_list;
  223. X{
  224. Xregister uint itmp;
  225. Xstatic char xfrw_nondelim_list[] =
  226. X{
  227. X    CR,NL,CTL_B,TAB,ESC,CTL_L,CTL_R,END
  228. X};
  229. X
  230. X    itmp = winget_single(xfrw,nondelim_list,xfrw_nondelim_list);
  231. X    if( (itmp & 0xFF) == 0x0D)
  232. X        itmp = NL | 0x1000;
  233. X    return(itmp);
  234. X}    /* end of xfrw_get_single */
  235. X
  236. X/*+-------------------------------------------------------------------------
  237. X    xfer_title_fragment(xfertype)
  238. X--------------------------------------------------------------------------*/
  239. Xchar *
  240. Xxfer_title_fragment()
  241. X{
  242. Xregister char *cptr = "UNKNOWN";
  243. X
  244. X    switch(xfertype)
  245. X    {
  246. X        case ECURZ_X:
  247. X        case ECUSZ_X: cptr = "XMODEM/CRC"; break;
  248. X        case ECURZ_Y:
  249. X        case ECUSZ_Y: cptr = "YMODEM/CRC"; break;
  250. X        case ECURZ_Z:
  251. X        case ECUSZ_Z: cptr = "ZMODEM/CRC32"; break;
  252. X        case ECUSEA:  cptr = "SEAlink"; break;
  253. X        case CKERMIT: cptr = "KERMIT/CRC" ;break;
  254. X    }
  255. X    return(cptr);
  256. X}    /* end of xfer_title_fragment */
  257. X
  258. X/*+-------------------------------------------------------------------------
  259. X    xfrw_display_cmd_line()
  260. X--------------------------------------------------------------------------*/
  261. Xvoid
  262. Xxfrw_display_cmd_line()
  263. X{
  264. Xregister itmp;
  265. Xchar *cmd_string = "TAB:next  ^B:prev  END:perform transfer  ESC:abort"; 
  266. Xregister left_spaces = ((xfrw_cols - 2) - strlen(cmd_string)) / 2;
  267. Xint x;
  268. Xint y;
  269. X
  270. X    wmove(xfrw,xfrw_lines - 2,1);
  271. X    wstandout(xfrw);
  272. X    for(itmp = 0; itmp < left_spaces; itmp++)
  273. X        waddch(xfrw,' ');
  274. X    waddstr(xfrw,cmd_string);
  275. X    getyx(xfrw,y,x);
  276. X    while(++x < xfrw_cols)
  277. X        waddch(xfrw,' '); 
  278. X    wstandend(xfrw);
  279. X
  280. X}    /* end of xfrw_display_cmd_line */
  281. X
  282. X/*+-------------------------------------------------------------------------
  283. X    xfrws_display_literals()
  284. X--------------------------------------------------------------------------*/
  285. Xvoid
  286. Xxfrws_display_literals()
  287. X{
  288. X    wmove(xfrw,SNDW_FILE_LY,SNDW_FILE_LX);
  289. X    if(xfertype == ECUSZ_X)
  290. X        waddstr(xfrw,"File");
  291. X    else
  292. X        waddstr(xfrw,"File(s)");
  293. X    waddstr(xfrw," to send:");
  294. X
  295. X    switch(xfertype)
  296. X    {
  297. X        case ECUSZ_Z:
  298. X            wmove(xfrw,SNDW_XFRNEW_Y,SNDW_XFRNEW_LX);
  299. X            waddstr(xfrw,"Transfer only newer files:");
  300. X            wmove(xfrw,SNDW_SNDFUL_Y,SNDW_SNDFUL_LX);
  301. X            waddstr(xfrw,"Send full pathames:");
  302. X            wmove(xfrw,SNDW_ZWINDW_Y,SNDW_ZWINDW_LX);
  303. X            waddstr(xfrw,"Window size:");
  304. X        case CKERMIT:
  305. X            wmove(xfrw,SNDW_OVERW_Y,SNDW_OVERW_LX);
  306. X            waddstr(xfrw,"Overwrite destination files:");
  307. X        case ECUSZ_Y:
  308. X        case ECUSZ_X:
  309. X            wmove(xfrw,SNDW_BIN_Y,SNDW_BIN_LX);
  310. X            waddstr(xfrw,"Binary:");
  311. X    }
  312. X}    /* end of xfrws_display_literals */
  313. X
  314. X/*+-------------------------------------------------------------------------
  315. X    xfrws_display_name()
  316. X--------------------------------------------------------------------------*/
  317. Xvoid
  318. Xxfrws_display_name()
  319. X{
  320. X    clear_area(xfrw,SNDW_FILE_Y,SNDW_FILE_X,SNDW_FILE_LEN);
  321. X    waddstr(xfrw,p_filelist);
  322. X
  323. X}    /* end of xfrws_display_name */
  324. X
  325. X/*+-------------------------------------------------------------------------
  326. X    xfrws_display_binary()
  327. X--------------------------------------------------------------------------*/
  328. Xvoid
  329. Xxfrws_display_binary()
  330. X{
  331. X    wmove(xfrw,SNDW_BIN_Y,SNDW_BIN_X);
  332. X    waddch(xfrw,(p_binary) ? 'Y' : 'N');
  333. X    if(p_binary)
  334. X        waddstr(xfrw," (no NL-CR/LF translation)     ");
  335. X    else
  336. X        waddstr(xfrw," (NL-CR/LF translation enabled)");
  337. X
  338. X}    /* end of xfrws_display_binary */
  339. X
  340. X/*+-------------------------------------------------------------------------
  341. X    xfrws_display_xfernew()
  342. X--------------------------------------------------------------------------*/
  343. Xvoid
  344. Xxfrws_display_xfernew()
  345. X{
  346. X    wmove(xfrw,SNDW_XFRNEW_Y,SNDW_XFRNEW_X);
  347. X    waddch(xfrw,(p_xfernew) ? 'Y' : 'N');
  348. X    if(p_xfernew)
  349. X        waddstr(xfrw," (if receiver supports)");
  350. X    else
  351. X        waddstr(xfrw,"                       ");
  352. X}    /* end of xfrws_display_xfernew */
  353. X
  354. X/*+-------------------------------------------------------------------------
  355. X    xfrws_display_allvars()
  356. X--------------------------------------------------------------------------*/
  357. Xvoid
  358. Xxfrws_display_allvars()
  359. X{
  360. Xchar s16[16];
  361. X
  362. X    xfrws_display_name();
  363. X    switch(xfertype)
  364. X    {
  365. X        case ECUSZ_Z:
  366. X            xfrws_display_xfernew();
  367. X            wmove(xfrw,SNDW_SNDFUL_Y,SNDW_SNDFUL_X);
  368. X            waddch(xfrw,(p_sendfull) ? 'Y' : 'N');
  369. X            wmove(xfrw,SNDW_ZWINDW_Y,SNDW_ZWINDW_X);
  370. X            sprintf(s16,"%d",zwindw_size);
  371. X            waddstr(xfrw,s16);
  372. X        case CKERMIT:
  373. X            wmove(xfrw,SNDW_OVERW_Y,SNDW_OVERW_X);
  374. X            waddch(xfrw,(p_overwrite) ? 'Y' : 'N');
  375. X        case ECUSZ_Y:
  376. X        case ECUSZ_X:
  377. X            xfrws_display_binary();
  378. X    }
  379. X}    /* end of xfrws_display_allvars */
  380. X
  381. X/*+-------------------------------------------------------------------------
  382. X    report_send_status() - report file transmission result
  383. Xreturns proc-type erc
  384. Xfor "ecu knowledgeable" protocols only
  385. X--------------------------------------------------------------------------*/
  386. Xreport_send_status()
  387. X{
  388. Xint erc = 0;
  389. Xunsigned int utmp;
  390. Xulong colors_at_entry = colors_current;
  391. Xchar *signal_name_text();
  392. X
  393. X    utmp = last_child_wait_status;
  394. X    if((utmp & 0xFF) == 0)    /* exit() called */
  395. X    {
  396. X        utmp >>= 8;
  397. X        if(utmp == 0)
  398. X        {
  399. X            setcolor(colors_notify);
  400. X            pputs("[transfer successful]");
  401. X            erc = 0;
  402. X        }
  403. X        else if(utmp == 255)
  404. X        {
  405. X            setcolor(colors_error);
  406. X            pputs("[ecu error: transfer program usage error]");
  407. X            erc = eFATAL_ALREADY;
  408. X        }
  409. X        else if(utmp == 254)
  410. X        {
  411. X            setcolor(colors_error);
  412. X            pputs(
  413. X            "[protocol failure: bad line conditions or remote not ready]");
  414. X            erc = eFATAL_ALREADY;
  415. X        }
  416. X        else if(utmp == 253)
  417. X        {
  418. X            setcolor(colors_alert);
  419. X            pputs("[no requested files exist]");
  420. X            erc = eFATAL_ALREADY;
  421. X        }
  422. X        else if(utmp < 128)
  423. X        {
  424. X            setcolor(colors_alert);
  425. X            if(utmp == 127)
  426. X                pputs("[127 or more files skipped]");
  427. X            else
  428. X                pprintf("[%u files rejected]",utmp);
  429. X            erc = 0;
  430. X        }
  431. X        else
  432. X        {
  433. X            setcolor(colors_alert);
  434. X            pprintf("[transfer aborted by %s]",
  435. X                signal_name_text(utmp & 0x7F));
  436. X            erc = eProcAttn_Interrupt;
  437. X        }
  438. X    }
  439. X    else
  440. X    {
  441. X        tcap_curbotleft();
  442. X        setcolor(colors_error);
  443. X        pprintf("[transfer killed by %s]",
  444. X            signal_name_text(utmp & 0x7F));
  445. X        erc = eProcAttn_Interrupt;
  446. X    }
  447. X
  448. X    setcolor(colors_at_entry);
  449. X    pputs("\n");
  450. X    return(erc);
  451. X
  452. X}    /* end of report_send_status */
  453. X
  454. X/*+-----------------------------------------------------------------------
  455. X    send_files_to_remote(argc,argv)
  456. X------------------------------------------------------------------------*/
  457. Xvoid
  458. Xsend_files_to_remote(argc,argv)
  459. Xint argc;
  460. Xchar **argv;
  461. X{
  462. Xregister itmp;
  463. Xregister input_state = 0;
  464. Xregister input_state_mod;
  465. Xint input_done;
  466. Xint used_argv = 0;
  467. Xchar execcmd[256];
  468. Xchar s80[80];
  469. Xchar flst[80];
  470. Xuchar delim;    /* important to be unsigned to avoid sign extension */
  471. XWINDOW *window_create();
  472. Xchar bottom_label[64];
  473. X
  474. X    p_binary = 1;        /* assume p_binary xfer */
  475. X    p_sendfull = 0;        /* assume no full pathnames */
  476. X    p_overwrite = 1;    /* assume overwrite */
  477. X    p_xfernew = 0;        /* assume send only newer */
  478. X    p_filelist[0] = 0;    /* no filenames yet */
  479. X#ifdef WHT
  480. X    zwindw_size = 16384;    /* my preference */
  481. X#else
  482. X    zwindw_size = 0;    /* assume full streaming sz */
  483. X#endif
  484. X
  485. X    switch(to_lower(*(argv[0] + 1)))
  486. X    {
  487. X        case 'x': xfertype = ECUSZ_X; break;
  488. X        case 'y': xfertype = ECUSZ_Y; break;
  489. X        case 'z': xfertype = ECUSZ_Z; break;
  490. X        case 'k': xfertype = CKERMIT; break;
  491. X        case 's': xfertype = ECUSEA; break;
  492. X        default: ff(se,"send command invalid\n");
  493. X            return;
  494. X    }
  495. X
  496. X    kill_rcvr_process(SIGUSR1);    /* SIGUSR1 gives chance to close log file */
  497. X
  498. X/* define and open window */
  499. X    input_state_mod = 0;
  500. X    xfrw_tlx = (COLS - SNDW_COLS) / 2;
  501. X    xfrw_cols = SNDW_COLS;
  502. X    switch(xfertype)
  503. X    {
  504. X        case ECUSEA:
  505. X            input_state_mod = 1;
  506. X            xfrw_lines = 7;
  507. X            break;
  508. X        case ECUSZ_X:
  509. X            input_state_mod = 2;
  510. X            xfrw_lines = 9;
  511. X            break;
  512. X        case ECUSZ_Z:
  513. X            input_state_mod = 6;
  514. X        case CKERMIT:
  515. X            if(!input_state_mod)
  516. X                input_state_mod = 3;
  517. X        case ECUSZ_Y:
  518. X            if(!input_state_mod)
  519. X                input_state_mod = 2;
  520. X            xfrw_lines = input_state_mod + 7;
  521. X            break;
  522. X        default:
  523. X            hangup(9999);
  524. X    }
  525. X
  526. X    windows_start();
  527. X    sprintf(execcmd,"Send %s",xfer_title_fragment());
  528. X    xfrw = window_create(execcmd,-3,SNDW_TLY,(int)xfrw_tlx,
  529. X            (int)xfrw_lines,(int)xfrw_cols);
  530. X    xfrw_display_cmd_line();
  531. X    xfrws_display_literals();
  532. X    xfrws_display_allvars();
  533. X    wmove(xfrw,0,27);
  534. X    waddstr(xfrw," dir: ");
  535. X    if(strlen(curr_dir) > (xfrw_cols - 32))
  536. X    {
  537. X        strncpy(s80,curr_dir,xfrw_cols - 32);
  538. X        s80[xfrw_cols - 32] = 0;
  539. X        waddstr(xfrw,s80);
  540. X    }
  541. X    else
  542. X        waddstr(xfrw,curr_dir);
  543. X    waddch(xfrw,' ');
  544. X    flst[0] = 0;
  545. X
  546. XREENTER_INPUT_LOOP:
  547. X    input_done = 0;
  548. X    while(!input_done)
  549. X    {
  550. X        switch(input_state)
  551. X        {
  552. X            case 0:        /* filename(s) */
  553. X                xfrw_bot_msg("enter file(s) to send");
  554. XCASE_0_AGAIN:
  555. X                if(used_argv || (argc == 1))
  556. X                {
  557. X                    itmp = wingets(xfrw,SNDW_FILE_Y,SNDW_FILE_X,flst,
  558. X                        SNDW_FILE_LEN + 1,&delim,(p_filelist[0] != 0));
  559. X                }
  560. X                else
  561. X                {
  562. X                    used_argv = 1;
  563. X                    flst[0] = 0;
  564. X                    for(itmp = 1; itmp < argc; itmp++)
  565. X                    {
  566. X                        if((strlen(flst) + strlen(argv[itmp]) + 1) > sizeof(flst))
  567. X                        {
  568. X                            xfrw_bot_msg("arguments too long ... reenter list");
  569. X                            ring_bell();
  570. X                            goto CASE_0_AGAIN;
  571. X                        }
  572. X                        strcat(flst,argv[itmp]);
  573. X                        if(itmp != (argc - 1))
  574. X                            strcat(flst," ");
  575. X                    }
  576. X                    delim = NL;
  577. X                }
  578. X                if(delim == ESC)
  579. X                    break;
  580. X                if(strlen(flst))
  581. X                {
  582. X                    strcpy(p_filelist,flst);
  583. X                    xfrws_display_name();
  584. X                    if(find_shell_chars(p_filelist))
  585. X                    {
  586. X                    char *expcmd;
  587. X
  588. X                        if(expand_cmd_with_wildlist(p_filelist,&expcmd))
  589. X                        {
  590. X                            xfrw_bot_msg(expcmd);
  591. X                            ring_bell();
  592. X                            goto CASE_0_AGAIN;
  593. X                        }
  594. X                        expcmd[SNDW_FILE_LEN - 1] = 0;
  595. X                        clear_area(xfrw,SNDW_FILE_Y,SNDW_FILE_X,SNDW_FILE_LEN);
  596. X                        waddstr(xfrw,expcmd);
  597. X                        free(expcmd);
  598. X                    }
  599. X                }
  600. X                break;
  601. X
  602. X            case 1:        /* binary */
  603. X                xfrw_bot_msg("Y: no conversion, N: NLs converted to CR/LF");
  604. X                wmove(xfrw,SNDW_BIN_Y,SNDW_BIN_X);
  605. X                wrefresh(xfrw);
  606. X                delim = NL;
  607. X                switch(itmp = xfrw_get_single("ny"))
  608. X                {
  609. X                    case 0:
  610. X                    case 1:
  611. X                        p_binary = itmp;
  612. X                        xfrws_display_binary();
  613. X                        break;
  614. X                    default:
  615. X                        delim = itmp & 0xFF;
  616. X                        break;
  617. X                }
  618. X                break;
  619. X
  620. X            case 2:        /* overwrite */
  621. X                xfrw_bot_msg("Y: overwrite, N: protect destination files");
  622. X                wmove(xfrw,SNDW_OVERW_Y,SNDW_OVERW_X);
  623. X                wrefresh(xfrw);
  624. X                delim = NL;
  625. X                switch(itmp = xfrw_get_single("ny"))
  626. X                {
  627. X                    case 0:
  628. X                    case 1:
  629. X                        p_overwrite = itmp;
  630. X                        break;
  631. X                    default:
  632. X                        delim = itmp & 0xFF;
  633. X                        break;
  634. X                }
  635. X                break;
  636. X
  637. X            case 3:        /* send full pathnames */
  638. X                xfrw_bot_msg(
  639. X                    "Y: full pathnames, N: strip directory portion from names");
  640. X                wmove(xfrw,SNDW_SNDFUL_Y,SNDW_SNDFUL_X);
  641. X                wrefresh(xfrw);
  642. X                delim = NL;
  643. X                switch(itmp = xfrw_get_single("ny"))
  644. X                {
  645. X                    case 0:
  646. X                    case 1:
  647. X                        p_sendfull = itmp;
  648. X                        break;
  649. X                    default:
  650. X                        delim = itmp & 0xFF;
  651. X                        break;
  652. X                }
  653. X                break;
  654. X
  655. X            case 4:        /* src newer than dest */
  656. X
  657. X                xfrw_bot_msg(
  658. X                "Y: send only if source newer than destination, N send all");
  659. X                wmove(xfrw,SNDW_XFRNEW_Y,SNDW_XFRNEW_X);
  660. X                wrefresh(xfrw);
  661. X                delim = NL;
  662. X                switch(itmp = xfrw_get_single("ny"))
  663. X                {
  664. X                    case 0:
  665. X                    case 1:
  666. X                        p_xfernew = itmp;
  667. X                        xfrws_display_xfernew();
  668. X                        break;
  669. X                    default:
  670. X                        delim = itmp & 0xFF;
  671. X                        break;
  672. X                }
  673. X                break;
  674. X
  675. X            case 5:        /* window size */
  676. X
  677. X                xfrw_bot_msg(
  678. X                "window size (max bytes sent before ACK required) 0 = stream");
  679. XCASE_5_AGAIN:
  680. X                sprintf(s80,"%d",zwindw_size);
  681. X                clear_area(xfrw,SNDW_ZWINDW_Y,SNDW_ZWINDW_X,
  682. X                    SNDW_ZWINDW_LEN + 10);
  683. X                itmp = wingets(xfrw,SNDW_ZWINDW_Y,SNDW_ZWINDW_X,s80,
  684. X                    SNDW_ZWINDW_LEN + 1,&delim,1);
  685. X                if((delim == ESC))
  686. X                    break;
  687. X                if( ((itmp = atoi(s80)) != 0) &&
  688. X                    ((itmp < 256) || (itmp > 65536)))
  689. X                {
  690. X                    ring_bell();
  691. X                    xfrw_bot_msg(
  692. X                        "window size must be 0 or 256 <= w <= 65536");
  693. X                    goto CASE_5_AGAIN;
  694. X                }
  695. X                zwindw_size = (itmp / 64) * 64;
  696. X                sprintf(s80,"%d%s",zwindw_size,
  697. X                    (zwindw_size != itmp) ? " adjusted" : "" );
  698. X                clear_area(xfrw,SNDW_ZWINDW_Y,SNDW_ZWINDW_X,
  699. X                    SNDW_ZWINDW_LEN + 10);
  700. X                waddstr(xfrw,s80);
  701. X                break;
  702. X        }
  703. X
  704. X        switch(delim)
  705. X        {
  706. X            case CTL_B:
  707. X                input_state = (input_state) ? input_state - 1 
  708. X                                            : input_state_mod - 1;
  709. X                break;
  710. X
  711. X            case TAB:
  712. X            case NL:
  713. X                input_state++;
  714. X                input_state %= input_state_mod;
  715. X                break;
  716. X
  717. X            case CTL_L:
  718. X            case CTL_R:
  719. X                tcap_clear_screen();
  720. X                touchwin(stdscr);
  721. X                wrefresh(stdscr);
  722. X                touchwin(xfrw);
  723. X                wrefresh(xfrw);
  724. X                break;
  725. X
  726. X            case ESC:
  727. X                xfrw_bot_msg("transfer abandoned");
  728. X                input_done = 1;
  729. X                break;
  730. X
  731. X            case END:
  732. X                input_done = 1;
  733. X                break;
  734. X        }
  735. X    }
  736. X
  737. X    if(delim == END)
  738. X    {
  739. X        if(!p_filelist[0])
  740. X        {
  741. X            ring_bell();
  742. X            xfrw_bot_msg("No filenames entered!  Press <ENTER>");
  743. X            (void)ttygetc(1);
  744. X            input_state = 0;
  745. X            goto REENTER_INPUT_LOOP;
  746. X        }
  747. X        xfrw_bot_msg("starting file transfer");
  748. X    }
  749. X
  750. X    windows_end(xfrw);
  751. X    tcap_cursor(SNDW_TLY + xfrw_lines + 1,0);
  752. X
  753. X    if(delim == ESC)
  754. X    {
  755. X        start_rcvr_process(1);
  756. X        return;
  757. X    }
  758. X
  759. X    bottom_label[0] = 0;
  760. X    if(shm->Llogical[0])
  761. X        sprintf(bottom_label,"-C \"'Connected to %s'\" ",shm->Llogical);
  762. X
  763. X/* we are going to do a transfer! */
  764. X    switch(xfertype)
  765. X    {
  766. X        case ECUSZ_X:
  767. X            sprintf(execcmd,"ecusz -X -. %d ",shm->Liofd);
  768. X            strcat(execcmd,bottom_label);
  769. X            if(protocol_log_packets)
  770. X                strcat(execcmd,"-, ");
  771. X            if(p_binary)
  772. X                strcat(execcmd,"-b ");
  773. X            else
  774. X                strcat(execcmd,"-a ");
  775. X            strcat(execcmd,p_filelist);
  776. X            break;
  777. X        case ECUSZ_Y:
  778. X            sprintf(execcmd,"ecusz -Y -. %d -k ",shm->Liofd);
  779. X            strcat(execcmd,bottom_label);
  780. X            if(protocol_log_packets)
  781. X                strcat(execcmd,"-, ");
  782. X            if(p_binary)
  783. X                strcat(execcmd,"-b ");
  784. X            else
  785. X                strcat(execcmd,"-a ");
  786. X            strcat(execcmd,p_filelist);
  787. X            break;
  788. X
  789. X        case ECUSZ_Z:
  790. X            sprintf(execcmd,"ecusz -Z -. %d ",shm->Liofd);
  791. X            strcat(execcmd,bottom_label);
  792. X            if(zwindw_size)
  793. X                sprintf(&execcmd[strlen(execcmd)]," -w %d ",zwindw_size);
  794. X            if(protocol_log_packets)
  795. X                strcat(execcmd,"-, ");
  796. X            if(p_overwrite)
  797. X                strcat(execcmd,"-y ");
  798. X            else
  799. X                strcat(execcmd,"-p ");
  800. X            if(p_binary)
  801. X                strcat(execcmd,"-b ");
  802. X            else
  803. X                strcat(execcmd,"-a ");
  804. X            if(p_xfernew)
  805. X                strcat(execcmd,"-n ");    /* overrides -y/-p choice earlier */
  806. X            if(p_sendfull)
  807. X                strcat(execcmd,"-f ");
  808. X            strcat(execcmd,p_filelist);
  809. X            break;
  810. X
  811. X        case ECUSEA:
  812. X            sprintf(execcmd,"ecusea -. %d -/ %s -s ",shm->Liofd,curr_dir);
  813. X            if(protocol_log_packets)
  814. X                strcat(execcmd,"-, ");
  815. X            strcat(execcmd,p_filelist);
  816. X            break;
  817. X
  818. X        case CKERMIT:
  819. X            sprintf(execcmd,"ckermit -l %d -b %u -p %c%s%s -s %s",
  820. X                    shm->Liofd,
  821. X                    shm->Lbaud,
  822. X                    (shm->Lparity) ? shm->Lparity : 'n',
  823. X                    (p_binary) ? " -i" : "",
  824. X                    (p_overwrite) ? "" : " -w",
  825. X                    p_filelist);
  826. X            break;
  827. X
  828. X    }
  829. X
  830. X    file_xfer_start();
  831. X
  832. X    if(find_shell_chars(execcmd))
  833. X    {
  834. X    char *expcmd;
  835. X
  836. X        if(expand_cmd_with_wildlist(execcmd,&expcmd))
  837. X        {
  838. X            ff(se,"No files match\r\n");
  839. X            return;
  840. X        }
  841. X        exec_cmd(expcmd);
  842. X        free(expcmd);
  843. X    }
  844. X    else
  845. X    {
  846. X        exec_cmd(execcmd);
  847. X        ff(se,"wierd 2\r\n");
  848. X    }
  849. X
  850. X    lreset_ksr();
  851. X
  852. X    switch(xfertype)
  853. X    {
  854. X        case ECUSEA:
  855. X        case ECUSZ_X:
  856. X        case ECUSZ_Y:
  857. X        case ECUSZ_Z:
  858. X            xfertype = 1;        /* was ecusz */
  859. X            break;
  860. X        default:
  861. X            xfertype = 0;
  862. X            break;
  863. X    }
  864. X
  865. X    if(xfertype)    /* ecu knowledgable */
  866. X        report_send_status();
  867. X    else
  868. X    {
  869. X        tcap_stand_out();
  870. X        ff(se," transfer status %04x ",last_child_wait_status);
  871. X        tcap_stand_end();
  872. X        ff(se,"\r\n");
  873. X    }
  874. X
  875. X    ff(se,"\r\n");
  876. X
  877. X    file_xfer_done_bell();
  878. X    start_rcvr_process(1);
  879. X}    /* end of send_files_to_remote */
  880. X
  881. X/*+-------------------------------------------------------------------------
  882. X    receive_files_from_remote(argc,argv)
  883. X--------------------------------------------------------------------------*/
  884. Xvoid
  885. Xreceive_files_from_remote(argc,argv)
  886. Xint argc;
  887. Xchar **argv;
  888. X{
  889. Xregister itmp;
  890. Xchar execcmd[256];
  891. Xint xfertype;
  892. Xchar bottom_label[64];
  893. X
  894. X    sprintf(bottom_label,"-C 'Connected to %s' ",
  895. X        (shm->Llogical[0]) ? shm->Llogical : "?");
  896. X
  897. X    switch(to_lower(*(argv[0] + 1)))
  898. X    {
  899. X        case 'k': xfertype = CKERMIT; break;
  900. X        case 's': xfertype = ECUSEA; break;
  901. X        case 'x': xfertype = ECURZ_X; break;
  902. X        case 'y': xfertype = ECURZ_Y; break;
  903. X        case 'z': xfertype = ECURZ_Z; break;
  904. X        default: ff(se,"receive command invalid\n");
  905. X            return;
  906. X    }
  907. X
  908. X    if(xfertype == ECURZ_X)
  909. X    {
  910. X    char xfilenam[128];
  911. X        kill_rcvr_process(SIGUSR1);
  912. X        sprintf(execcmd,"ecurz -X -. %d -c ",shm->Liofd);
  913. X        strcat(execcmd,bottom_label);
  914. X        if(protocol_log_packets)
  915. X            strcat(execcmd,"-, ");
  916. X
  917. X        ff(se,"    File name to receive via XMODEM/CRC:  ");
  918. X        ttygets(xfilenam,sizeof(xfilenam),1);
  919. X        if( (xfilenam[0] == ESC) || !strlen(xfilenam))
  920. X        {
  921. X            ff(se,"transfer abandoned\r\n");
  922. X            start_rcvr_process(1);
  923. X            return;
  924. X        }
  925. X        /* get xmodem ascii or binary */
  926. X        ff(se,"Translate CR/LF to NL (y,n)? ");
  927. X        switch(itmp = to_lower(ttygetc(0)))
  928. X        {
  929. X            case 'y': strcat(execcmd,"-a "); break;
  930. X            case 'n': strcat(execcmd,"-b "); break;
  931. X            default:
  932. X                ff(se,"transfer abandoned\r\n");
  933. X                start_rcvr_process(1);
  934. X                return;
  935. X        }
  936. X        ff(se,"%s\r\n",(itmp == 'y') ? "yes" : "no");
  937. X        strcat(execcmd,xfilenam);
  938. X        file_xfer_start();
  939. X        exec_cmd(execcmd);
  940. X    }
  941. X    else if(xfertype == ECURZ_Y)
  942. X    {
  943. X        ff(se,"\r\n");
  944. X        kill_rcvr_process(SIGUSR1);
  945. X        sprintf(execcmd,"ecurz -Y -. %d -y ",shm->Liofd);
  946. X        strcat(execcmd,bottom_label);
  947. X        if(protocol_log_packets)
  948. X            strcat(execcmd,"-, ");
  949. X        file_xfer_start();
  950. X        exec_cmd(execcmd);
  951. X    }
  952. X    else if(xfertype == ECURZ_Z)
  953. X    {
  954. X        ff(se,"\r\n");
  955. X        kill_rcvr_process(SIGUSR1);
  956. X        sprintf(execcmd,"ecurz -Z -. %d ",shm->Liofd);
  957. X        if(protocol_log_packets)
  958. X            strcat(execcmd,"-, ");
  959. X        strcat(execcmd,bottom_label);
  960. X        file_xfer_start();
  961. X        exec_cmd(execcmd);
  962. X    }
  963. X    else if(xfertype == CKERMIT)
  964. X    {
  965. X        kill_rcvr_process(SIGUSR1);
  966. X        sprintf(execcmd,"ckermit -r -e 512 -l %d -b %d -p %c",
  967. X            shm->Liofd,shm->Lbaud,(shm->Lparity) ? shm->Lparity : 'n');
  968. X        ff(se,"    Translate CR/LF to NL (y,n)? ");
  969. X        switch(itmp = to_lower(ttygetc(0)))
  970. X        {
  971. X            case 'y': strcat(execcmd," -i"); break;
  972. X            case 'n': break;
  973. X            default:
  974. X                ff(se,"transfer abandoned\r\n");
  975. X                start_rcvr_process(1);
  976. X                return;
  977. X        }
  978. X        ff(se,"%s\r\n",(itmp == 'a') ? "yes" : "no");
  979. X        file_xfer_start();
  980. X        exec_cmd(execcmd);
  981. X    }
  982. X    else if(xfertype == ECUSEA)
  983. X    {
  984. X        kill_rcvr_process(SIGUSR1);
  985. X        sprintf(execcmd,"ecusea -r -. %d -/ %s",shm->Liofd,curr_dir);
  986. X        if(protocol_log_packets)
  987. X            strcat(execcmd," -,");
  988. X        file_xfer_start();
  989. X        exec_cmd(execcmd);
  990. X    }
  991. X    lreset_ksr();
  992. X    file_xfer_done_bell();
  993. X    nap(20L);
  994. X    start_rcvr_process(1);
  995. X}    /* end of receive_files_from_remote */
  996. X/* end of ecuxfer.c */
  997. X/* vi: set tabstop=4 shiftwidth=4: */
  998. SHAR_EOF
  999. $TOUCH -am 1224223790 'ecuxfer.c' &&
  1000. chmod 0644 ecuxfer.c ||
  1001. echo 'restore of ecuxfer.c failed'
  1002. Wc_c="`wc -c < 'ecuxfer.c'`"
  1003. test 23483 -eq "$Wc_c" ||
  1004.     echo 'ecuxfer.c: original size 23483, current size' "$Wc_c"
  1005. # ============= esdutil.c ==============
  1006. echo 'x - extracting esdutil.c (Text)'
  1007. sed 's/^X//' << 'SHAR_EOF' > 'esdutil.c' &&
  1008. X/*+----------------------------------------------------------------
  1009. X    esdutil.c - ecu extended string descriptor manipulation
  1010. X    wht@n4hgf.Mt-Park.GA.US
  1011. X
  1012. X  Defined functions:
  1013. X    append_zstr_to_esd(param,zstr)
  1014. X    end_of_cmd(param)
  1015. X    esdstrindex(esd1,esd2,index1_flag,index2_flag)
  1016. X    fgetesd(param,fileptr)
  1017. X    fputesd(param,fileptr,index_flag,nl_flag)
  1018. X    free_esd(tesd)
  1019. X    get_alpha_zstr(param,strbuf,strbuf_maxcb)
  1020. X    get_alphanum_zstr(param,strbuf,strbuf_maxcb)
  1021. X    get_cmd_char(param,pchar)
  1022. X    get_numeric_value(param,value)
  1023. X    get_numeric_zstr(param,strbuf,strbuf_maxcb)
  1024. X    get_switches(param,switches,switches_max)
  1025. X    get_word_zstr(param,strbuf,strbuf_maxcb)
  1026. X    init_esd(tesd,cptr,maxcb)
  1027. X    keyword_lookup(ktable,param)
  1028. X    make_esd(maxcb)
  1029. X    null_terminate_esd(tesd)
  1030. X    realloc_esd(tesd,maxcb)
  1031. X    show_esd(tesd,title)
  1032. X    skip_cmd_break(param)
  1033. X    skip_cmd_char(param,skipchar)
  1034. X    skip_colon(param)
  1035. X    skip_comma(param)
  1036. X    skip_paren(param,fLeft)
  1037. X    strindex(str1,str2)
  1038. X    strip_trailing_spaces_esd(ztext)
  1039. X    zero_esd(tesd)
  1040. X
  1041. XThis is old code; give me a break
  1042. X-----------------------------------------------------------------*/
  1043. X/*+:EDITS:*/
  1044. X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  1045. X
  1046. X#include <ctype.h>
  1047. X#include "ecu.h"
  1048. X#include "ecuerror.h"
  1049. X#include "esd.h"
  1050. X
  1051. Xextern int errno;
  1052. X
  1053. X/*+-------------------------------------------------------------------------
  1054. X    null_terminate_esd(&esd)
  1055. X    puts null at 'cb' position of string (standard esd always
  1056. X    has one more byte in buffer than maxcb says)
  1057. X--------------------------------------------------------------------------*/
  1058. Xvoid
  1059. Xnull_terminate_esd(tesd)
  1060. Xregister ESD *tesd;
  1061. X{
  1062. X    tesd->pb[tesd->cb] = 0;
  1063. X}   /* end of null_terminate_esd */
  1064. X
  1065. X/*+-----------------------------------------------------------------------
  1066. X    zero_esd(tesd)  zero an esd 
  1067. X------------------------------------------------------------------------*/
  1068. Xvoid
  1069. Xzero_esd(tesd)
  1070. Xregister ESD *tesd;
  1071. X{
  1072. X    tesd->cb = 0;                /* current count == 0 */
  1073. X    tesd->index = 0;            /* parse index to first position */
  1074. X    tesd->old_index = 0;        /* parse index to first position */
  1075. X    *tesd->pb = 0;                /* start with null terminated string */
  1076. X
  1077. X}    /* end of zero_esd */
  1078. X
  1079. X/*+-----------------------------------------------------------------------
  1080. X    init_esd(tesd,cptr,maxcb)  init an esd 
  1081. X------------------------------------------------------------------------*/
  1082. Xvoid
  1083. Xinit_esd(tesd,cptr,maxcb)
  1084. Xregister ESD *tesd;
  1085. Xchar *cptr;
  1086. Xregister maxcb;
  1087. X{
  1088. X    tesd->pb = cptr;            /* pointer to string */
  1089. X    tesd->maxcb = maxcb;        /* max characters in buffer */
  1090. X    zero_esd(tesd);
  1091. X
  1092. X}    /* end of init_esd */
  1093. X
  1094. X/*+-----------------------------------------------------------------------
  1095. X    esdptr = make_esd(maxcb)    allocate an esd and buffer
  1096. X------------------------------------------------------------------------*/
  1097. XESD *
  1098. Xmake_esd(maxcb)
  1099. Xregister maxcb;        /* desired maxcb */
  1100. X{
  1101. Xregister ESD *tesd;
  1102. Xregister actual_cb;
  1103. X
  1104. X    /* we get an extra character to ensure room for null past maxcb */
  1105. X    actual_cb = maxcb + 1;
  1106. X    if(actual_cb & 1)        /* even allocation */
  1107. X        ++actual_cb;
  1108. X
  1109. X    if(!(tesd = (ESD *)malloc(sizeof(ESD))))
  1110. X        return((ESD *)0);     /* return NULL if failure */
  1111. X
  1112. X    if(!(tesd->pb = malloc(actual_cb)))
  1113. X    {
  1114. X        free((char *)tesd);
  1115. X        return((ESD *)0);     /* return NULL if failure */
  1116. X    }
  1117. X
  1118. X    init_esd(tesd,tesd->pb,maxcb);
  1119. X    return(tesd);
  1120. X
  1121. X}    /* end of make_esd */
  1122. X
  1123. X/*+-----------------------------------------------------------------------
  1124. X    esdptr = realloc_esd(maxcb)    - realloc an esd buffer
  1125. X------------------------------------------------------------------------*/
  1126. Xint
  1127. Xrealloc_esd(tesd,maxcb)
  1128. XESD *tesd;
  1129. Xregister maxcb;        /* desired maxcb */
  1130. X{
  1131. Xregister actual_cb;
  1132. X
  1133. X    if(!tesd)
  1134. X        return(eInternalLogicError);
  1135. X
  1136. X    /* we get an extra character to ensure room for null past maxcb */
  1137. X    actual_cb = maxcb + 1;
  1138. X    if(actual_cb & 1)        /* even allocation */
  1139. X        ++actual_cb;
  1140. X
  1141. X    if(!(tesd->pb = realloc(tesd->pb,actual_cb)))
  1142. X    {
  1143. X        errno = ENOMEM;
  1144. X        ff(se,"\r\n\r\nMEMORY REALLOC FAILED. FATAL ERROR. SORRY.\r\n");
  1145. X        hangup(HANGUP_XMTR_LOGIC_ERROR);
  1146. X    }
  1147. X
  1148. X    return(0);
  1149. X
  1150. X}    /* end of realloc_esd */
  1151. X
  1152. X/*+-----------------------------------------------------------------------
  1153. X    free_esd(esdptr)
  1154. X------------------------------------------------------------------------*/
  1155. Xvoid
  1156. Xfree_esd(tesd)
  1157. Xregister ESD *tesd;
  1158. X{
  1159. X    if(tesd && tesd->pb)
  1160. X    {
  1161. X        free(tesd->pb);
  1162. X        free((char *)tesd);
  1163. X    }
  1164. X    else
  1165. X    {
  1166. X        errno = ENOMEM;
  1167. X        ff(se,"\r\n\r\nFREE_ESD FAILED. FATAL ERROR. SORRY.\r\n");
  1168. X        hangup(HANGUP_XMTR_LOGIC_ERROR);
  1169. X    }
  1170. X}
  1171. X
  1172. X/*+-------------------------------------------------------------------------
  1173. X    show_esd(tesd,title)
  1174. X--------------------------------------------------------------------------*/
  1175. Xvoid
  1176. Xshow_esd(tesd,title)
  1177. XESD *tesd;
  1178. Xchar *title;
  1179. X{
  1180. Xregister itmp;
  1181. X
  1182. X    if(title && *title)
  1183. X    {
  1184. X        pputs(title);
  1185. X        pputs("\n");
  1186. X    }
  1187. X    null_terminate_esd(tesd);
  1188. X    pputs(tesd->pb);
  1189. X    pputs("\n");
  1190. X    for(itmp = 0; itmp <= tesd->cb; itmp++)
  1191. X    {
  1192. X        if(itmp == tesd->old_index)
  1193. X            pputc('^');
  1194. X        else if(itmp == tesd->index)
  1195. X            pputc('^');
  1196. X        else
  1197. X            pputc(' ');
  1198. X        if((itmp > tesd->old_index) && (itmp > tesd->index))
  1199. X            break;
  1200. X    }
  1201. X    pprintf(" o%d i%d c%d\n",tesd->old_index,tesd->index,tesd->cb);
  1202. X
  1203. X}    /* end of show_esd */
  1204. X
  1205. X/*+----------------------------------------------------------------
  1206. X    strindex:  string index function
  1207. X
  1208. X  Returns position of 'str2' in 'str1' if found
  1209. X  If 'str2' is null, then 0 is returned (null matches anything)
  1210. X  Returns -1 if not found
  1211. X-----------------------------------------------------------------*/
  1212. Xint
  1213. Xstrindex(str1,str2)
  1214. Xchar *str1;    /* the (target) string to search */
  1215. Xchar *str2;    /* the (comparand) string to search for */
  1216. X{
  1217. Xregister istr1 = 0;
  1218. Xregister lstr2 = strlen(str2);
  1219. Xregister char *mstr = str1;    /* the (target) string to search */
  1220. X
  1221. X    if(*str2 == 0)            /* null string matches anything */
  1222. X        return(0);
  1223. X
  1224. X    while(*mstr)
  1225. X    {
  1226. X        if(*mstr == *str2)
  1227. X        { /* we have a first char match... does rest of string match? */
  1228. X            if(!strncmp(mstr,str2,lstr2))
  1229. X                return(istr1);        /* if so, return match position */
  1230. X        }
  1231. X        mstr++;
  1232. X        istr1++;
  1233. X    }
  1234. X
  1235. X    return(-1);        /* if we exhaust target string, flunk */
  1236. X
  1237. X}   /* end of strindex */
  1238. X
  1239. X/*+-------------------------------------------------------------------------
  1240. X    esdstrindex(esd1,esd2,index1_flag,index2_flag)
  1241. X
  1242. X  Call strindex with esd1->pb and esd2->pb.
  1243. X  If index1_flag != 0, esd1->pb + esd1->index passed
  1244. X  If index2_flag != 0, esd2->pb + esd2->index passed
  1245. X--------------------------------------------------------------------------*/
  1246. Xesdstrindex(esd1,esd2,index1_flag,index2_flag)
  1247. Xregister ESD *esd1;
  1248. Xregister ESD *esd2;
  1249. Xregister index1_flag;
  1250. Xregister index2_flag;
  1251. X{
  1252. X    return(strindex((index1_flag) ? esd1->pb : esd1->pb + esd1->index,
  1253. X        (index2_flag) ? esd2->pb : esd2->pb + esd2->index));
  1254. X
  1255. X}    /* end of esdstrindex */
  1256. X
  1257. X/*+----------------------------------------------------------------
  1258. X    keyword_lookup(ktable,param)
  1259. X
  1260. X  Lookup string in keyword_table struct array
  1261. X  Returns table->key_token if 'param' found in
  1262. X  'table', else -1
  1263. X
  1264. X  Beware substrings.  "type","typedef" will both match "type"
  1265. X-----------------------------------------------------------------*/
  1266. Xkeyword_lookup(ktable,param)
  1267. Xregister KEYTAB *ktable;
  1268. Xregister char *param;
  1269. X{
  1270. X/* register plen = strlen(param); */
  1271. X
  1272. X    while(ktable->key_word)
  1273. X    {
  1274. X/*        if(!strncmp(ktable->key_word,param,plen)) */
  1275. X        if(!strcmp(ktable->key_word,param))
  1276. X            return(ktable->key_token);
  1277. X        ++ktable;
  1278. X    }   /* end of while */
  1279. X
  1280. X    return(-1);     /* search failed */
  1281. X
  1282. X}   /* end of keyword_lookup */
  1283. X
  1284. X/*+----------------------------------------------------------------
  1285. X    skip_cmd_break(param)
  1286. X
  1287. X  Finds next non-break
  1288. X
  1289. X  'param' is an esd with valid 'index' field
  1290. X  Returns  0             index field points to non-break character
  1291. X           eNoParameter  end of command found
  1292. X-----------------------------------------------------------------*/
  1293. Xint
  1294. Xskip_cmd_break(param)
  1295. Xregister ESD *param;
  1296. X{
  1297. Xregister cb = param->cb;
  1298. Xregister index = param->index;
  1299. Xregister char *pb = param->pb;
  1300. X
  1301. X    while(index < cb)
  1302. X    {
  1303. X        if(!isspace(*(pb + index)))
  1304. X            break;
  1305. X        index++;
  1306. X    }
  1307. X    param->old_index = param->index = index;
  1308. X    if(index >= cb)
  1309. X        return(eNoParameter);
  1310. X    return(0);
  1311. X
  1312. X}   /* end of skip_cmd_break */
  1313. X
  1314. X/*+-------------------------------------------------------------------------
  1315. X    end_of_cmd(param) - return 1 if at end of command
  1316. X--------------------------------------------------------------------------*/
  1317. Xint
  1318. Xend_of_cmd(param)
  1319. Xregister ESD *param;
  1320. X{
  1321. X    if(skip_cmd_break(param) || (*(param->pb + param->index) == ';') ||
  1322. X            (*(param->pb + param->index) == '#'))
  1323. X        return(1);
  1324. X    return(0);
  1325. X}    /* end of end_of_cmd */
  1326. X
  1327. X/*+-------------------------------------------------------------------------
  1328. X    erc = skip_cmd_char(param,skipchar)
  1329. X--------------------------------------------------------------------------*/
  1330. Xint
  1331. Xskip_cmd_char(param,skipchar)
  1332. Xregister ESD *param;
  1333. Xregister char skipchar;
  1334. X{
  1335. Xint erc;
  1336. X
  1337. X    if(erc = skip_cmd_break(param))
  1338. X        return(erc);
  1339. X
  1340. X    if(param->pb[param->index] == skipchar)
  1341. X    {
  1342. X        ++param->index;
  1343. X        return(0);
  1344. X    }
  1345. X
  1346. X    return(eSyntaxError);
  1347. X
  1348. X}   /* end of skip_cmd_char */
  1349. X
  1350. X/*+-------------------------------------------------------------------------
  1351. X    erc = skip_colon(param)
  1352. X--------------------------------------------------------------------------*/
  1353. Xint
  1354. Xskip_colon(param)
  1355. Xregister ESD *param;
  1356. X{
  1357. X    register erc;
  1358. X
  1359. X    if(erc = skip_cmd_break(param))
  1360. X        return(erc);
  1361. X
  1362. X    if(param->pb[param->index] == ':')
  1363. X    {
  1364. X        ++param->index;
  1365. X        return(0);
  1366. X    }
  1367. X
  1368. X    return(eCommaExpected);
  1369. X
  1370. X}   /* end of skip_colon */
  1371. X
  1372. X/*+-------------------------------------------------------------------------
  1373. X    erc = skip_comma(param)
  1374. X--------------------------------------------------------------------------*/
  1375. Xint
  1376. Xskip_comma(param)
  1377. Xregister ESD *param;
  1378. X{
  1379. X    register erc;
  1380. X
  1381. X    if(erc = skip_cmd_break(param))
  1382. X        return(erc);
  1383. X
  1384. X    if(param->pb[param->index] == ',')
  1385. X    {
  1386. X        ++param->index;
  1387. X        return(0);
  1388. X    }
  1389. X
  1390. X    return(eCommaExpected);
  1391. X
  1392. X}   /* end of skip_comma */
  1393. X
  1394. X/*+-------------------------------------------------------------------------
  1395. X    erc = skip_paren(fparam,LEFT or RIGHT)
  1396. X--------------------------------------------------------------------------*/
  1397. Xint
  1398. Xskip_paren(param,fLeft)
  1399. Xregister ESD *param;
  1400. Xint fLeft;
  1401. X{
  1402. Xregister erc;
  1403. Xregister char search = (fLeft) ? '(' : ')';
  1404. X
  1405. X    if(erc = skip_cmd_break(param))
  1406. X        return(erc);
  1407. X
  1408. X    if(param->pb[param->index] == search)
  1409. X    {
  1410. X        param->index++;
  1411. X        return(0);
  1412. X    }
  1413. X    return((fLeft) ? eMissingLeftParen : eMissingRightParen);
  1414. X
  1415. X}   /* end of skip_paren */
  1416. X
  1417. X/*+-------------------------------------------------------------------------
  1418. X    get_cmd_char(param,pchar)
  1419. X--------------------------------------------------------------------------*/
  1420. Xint
  1421. Xget_cmd_char(param,pchar)
  1422. Xregister ESD *param;
  1423. Xchar *pchar;
  1424. X{
  1425. Xint erc;
  1426. X
  1427. X    if(erc = skip_cmd_break(param))
  1428. X        return(erc);
  1429. X    *pchar = param->pb[param->index++];
  1430. X    return(0);
  1431. X
  1432. X}    /* end of get_cmd_char */
  1433. X
  1434. X/*+----------------------------------------------------------------
  1435. X    get_alpha_zstr(&esd,&strbuf,strbuf_maxcb)
  1436. X
  1437. X  places next alphabetic string token [A-Za-z_] into
  1438. X  the null-terminated 'strbuf' string.  returns 0 or -1
  1439. X  or skip_cmd_break error codes
  1440. X-----------------------------------------------------------------*/
  1441. Xint
  1442. Xget_alpha_zstr(param,strbuf,strbuf_maxcb)
  1443. XESD *param;
  1444. Xregister char *strbuf;
  1445. Xint strbuf_maxcb;
  1446. X{
  1447. Xregister izstr;
  1448. Xregister schar;
  1449. Xregister char *pb = param->pb;
  1450. X
  1451. X    if(izstr = skip_cmd_break(param))
  1452. X        return(izstr);
  1453. X    izstr = 0;
  1454. X    while( (izstr < strbuf_maxcb-1) && (param->index < param->cb) )
  1455. X    {
  1456. X        schar = pb[param->index];
  1457. X        if((!isalpha(schar)) && (schar != '_'))
  1458. X            break;
  1459. X        strbuf[izstr++] = schar;
  1460. X        param->index++;
  1461. X    }
  1462. X
  1463. X    strbuf[izstr] = 0;
  1464. X    return(izstr ? 0 : eBadParameter);
  1465. X
  1466. X}   /* end of get_alpha_zstr */
  1467. X
  1468. X/*+----------------------------------------------------------------
  1469. X    get_alphanum_zstr(&esd,&strbuf,strbuf_maxcb)
  1470. X
  1471. X  places next alphanumeric string token [A-Za-z0-9_]
  1472. X  into the null-terminated 'strbuf' string.  returns 0
  1473. X  or -1 or skip_cmd_break error codes
  1474. X-----------------------------------------------------------------*/
  1475. Xint
  1476. Xget_alphanum_zstr(param,strbuf,strbuf_maxcb)
  1477. Xregister ESD *param;
  1478. Xregister char *strbuf;
  1479. Xint strbuf_maxcb;
  1480. X{
  1481. Xint izstr = 0;
  1482. Xint schar;
  1483. Xregister cb = param->cb;
  1484. Xregister index;
  1485. X
  1486. X    if(izstr = skip_cmd_break(param))
  1487. X        return(izstr);
  1488. X
  1489. X    index = param->index;
  1490. X    while( (izstr < strbuf_maxcb-1) && (index < cb))
  1491. X    {
  1492. X        schar = param->pb[index++];
  1493. X        if(isalnum(schar) || (schar == '_'))
  1494. X            strbuf[izstr++] = schar;
  1495. X        else
  1496. X        {
  1497. X            --index;
  1498. X            break;
  1499. X        }
  1500. X    }
  1501. X
  1502. X    param->index = index;
  1503. X    strbuf[izstr]=0;
  1504. X    return(izstr ? 0 : eBadParameter);
  1505. X
  1506. X}   /* end of get_alphanum_zstr */
  1507. X
  1508. X/*+----------------------------------------------------------------
  1509. X    get_numeric_zstr(&esd,&strbuf,strbuf_maxcb)
  1510. X    gets next numeric string token places it
  1511. X    into the null-terminated 'strbuf' string.  returns 0 or -1 
  1512. X    or skip_cmd_break error codes
  1513. X-----------------------------------------------------------------*/
  1514. Xint
  1515. Xget_numeric_zstr(param,strbuf,strbuf_maxcb)
  1516. Xregister ESD *param;
  1517. Xregister char *strbuf;
  1518. Xregister strbuf_maxcb;
  1519. X{
  1520. X    register izstr;
  1521. X    register schar;
  1522. X
  1523. X    if(izstr = skip_cmd_break(param))
  1524. X        return(izstr);
  1525. X
  1526. X    while( (izstr < strbuf_maxcb-1) && (param->index < param->cb) )
  1527. X    {
  1528. X        schar = param->pb[param->index++];
  1529. X        if( isdigit(schar) )
  1530. X            strbuf[izstr++]=schar;
  1531. X        else
  1532. X        {
  1533. X            --param->index;
  1534. X            break;
  1535. X        }
  1536. X    }
  1537. X
  1538. X    strbuf[izstr]=0;
  1539. X    return(izstr ? 0 : eBadParameter);
  1540. X
  1541. X}   /* end of get_numeric_zstr */
  1542. X
  1543. X/*+-----------------------------------------------------------------------
  1544. X    get_numeric_value(param,&long_var)
  1545. X------------------------------------------------------------------------*/
  1546. Xget_numeric_value(param,value)
  1547. Xregister ESD *param;
  1548. Xregister long *value;
  1549. X{
  1550. Xregister erc;
  1551. Xchar buf[32];
  1552. X
  1553. X    if(erc = get_numeric_zstr(param,buf,sizeof(buf)))
  1554. X        return(erc);
  1555. X    sscanf(buf,"%ld",value);
  1556. X    return(0);
  1557. X
  1558. X}    /* end of get_numeric_value */
  1559. X
  1560. X/*+----------------------------------------------------------------
  1561. X    get_word_zstr(&esd,&strbuf,strbuf_maxcb)
  1562. X
  1563. X  gets next word (continuous string of characters without spaces
  1564. X  or tabs) returns 0 or -1 or skip_cmd_break error codes
  1565. X-----------------------------------------------------------------*/
  1566. Xint
  1567. Xget_word_zstr(param,strbuf,strbuf_maxcb)
  1568. Xregister ESD *param;
  1569. Xregister char *strbuf;
  1570. Xregister strbuf_maxcb;
  1571. X{
  1572. X    register izstr;
  1573. X    register schar;
  1574. X
  1575. X    if(izstr = skip_cmd_break(param))
  1576. X        return(izstr);
  1577. X
  1578. X    strbuf_maxcb--;
  1579. X    while((izstr < strbuf_maxcb) && (param->index < param->cb))
  1580. X    {
  1581. X        schar = param->pb[param->index++];
  1582. X        if( (schar > 0x20) && (schar <= 0x7e))
  1583. X            strbuf[izstr++]=schar;
  1584. X        else
  1585. X        {
  1586. X            --param->index;
  1587. X            break;
  1588. X        }
  1589. X    }
  1590. X
  1591. X    strbuf[izstr]=0;
  1592. X    return(izstr ? 0 : eBadParameter);
  1593. X
  1594. X}   /* end of get_word_zstr */
  1595. X
  1596. X/*+-------------------------------------------------------------------------
  1597. X    strip_trailing_spaces_esd(param)
  1598. X--------------------------------------------------------------------------*/
  1599. Xvoid
  1600. Xstrip_trailing_spaces_esd(ztext)
  1601. Xregister ESD *ztext;
  1602. X{
  1603. X    while(ztext->cb &&
  1604. X        ((ztext->pb[ztext->cb-1] == 0x20) || (ztext->pb[ztext->cb-1] == 0x20)))
  1605. X    {
  1606. X        ztext->cb--;
  1607. X    }
  1608. X}   /* end of strip_trailing_spaces_esd */
  1609. X
  1610. X/*+-------------------------------------------------------------------------
  1611. X    fgetesd(&esd,fileptr)
  1612. X
  1613. X  stdio read from FILE *fileptr into esd
  1614. X  returns param->cb set up not including trailing nl, param->index == 0
  1615. X--------------------------------------------------------------------------*/
  1616. Xint
  1617. Xfgetesd(param,fileptr)
  1618. Xregister ESD *param;
  1619. Xregister FILE *fileptr;
  1620. X{
  1621. Xregister char *cptr;
  1622. X
  1623. X    if(fgets(param->pb,param->maxcb,fileptr) == NULL)
  1624. X        return(eEOF);
  1625. X    if((cptr = strchr(param->pb,0x0A)) == NULL)
  1626. X        return(eBufferTooSmall);
  1627. X    param->cb = (int)(cptr - param->pb);
  1628. X    null_terminate_esd(param);
  1629. X    param->index = 0;
  1630. X    param->old_index = 0;
  1631. X    return(0);
  1632. X
  1633. X}    /* end of fgetesd */
  1634. X
  1635. X/*+-------------------------------------------------------------------------
  1636. X    fputesd(&esd,fileptr,index_flag,nl_flag)
  1637. X
  1638. X  write esd contents to stdio FILE *fileptr
  1639. X  if index_flag is true, write from param->index thru end of esd
  1640. X  otherwise, from start of esd
  1641. X  if nl_flag is true, append nl to write, else just esd contents
  1642. X--------------------------------------------------------------------------*/
  1643. Xint
  1644. Xfputesd(param,fileptr,index_flag,nl_flag)
  1645. Xregister ESD *param;
  1646. XFILE *fileptr;
  1647. Xint index_flag;
  1648. Xint nl_flag;
  1649. X{
  1650. Xregister char *cptr;
  1651. Xregister write_length;
  1652. X
  1653. X    if(index_flag)
  1654. X    {
  1655. X        cptr = ¶m->pb[param->index];
  1656. X        write_length = param->cb - param->index;
  1657. X    }
  1658. X    else
  1659. X    {
  1660. X        cptr = param->pb;
  1661. X        write_length = param->cb;
  1662. X    }
  1663. X
  1664. X    if(write_length)
  1665. X        fwrite(cptr,write_length,1,fileptr);
  1666. X
  1667. X    if(nl_flag)
  1668. X        fputc(0x0A,fileptr);
  1669. X
  1670. X    return(0);
  1671. X}    /* end of fputesd */
  1672. X
  1673. X/*+-----------------------------------------------------------------
  1674. X    append_zstr_to_esd(param,zstr)
  1675. X------------------------------------------------------------------*/
  1676. Xappend_zstr_to_esd(param,zstr)
  1677. XESD *param;
  1678. Xchar *zstr;
  1679. X{
  1680. Xregister zstrlen = strlen(zstr);
  1681. Xregister erc = 0;
  1682. X
  1683. X    if(zstrlen > (param->maxcb - param->cb))
  1684. X    {
  1685. X        zstrlen = param->maxcb - param->cb;
  1686. X        erc = eBufferTooSmall;
  1687. X    }
  1688. X
  1689. X    if(zstrlen)
  1690. X    {
  1691. X        strncpy(param->pb + param->cb,zstr,zstrlen);
  1692. X        param->cb += zstrlen;
  1693. X    }
  1694. X    return(erc);
  1695. X}
  1696. X
  1697. X/*+-------------------------------------------------------------------------
  1698. X    get_switches(param,switches,switches_max)
  1699. X--------------------------------------------------------------------------*/
  1700. Xint
  1701. Xget_switches(param,switches,switches_max)
  1702. XESD *param;
  1703. Xchar *switches;
  1704. Xint switches_max;
  1705. X{
  1706. Xregister itmp;
  1707. Xregister index;
  1708. Xregister char *pb = param->pb;
  1709. Xint cb = param->cb;
  1710. Xchar schar;
  1711. X
  1712. X    *switches = 0;
  1713. X
  1714. X    if(itmp = skip_cmd_break(param))
  1715. X        return(itmp);
  1716. X
  1717. X    index = param->index;
  1718. X    if(*(param->pb + index) != '-')
  1719. X        return(eNoSwitches);
  1720. X
  1721. X    switches_max--;
  1722. X    *switches++ = '-';
  1723. X    index++;
  1724. X    while((itmp < switches_max) && (index < cb))
  1725. X    {
  1726. X        schar = *(pb + index++);
  1727. X        if(isspace(schar))
  1728. X            break;
  1729. X        *switches++ = schar;
  1730. X    }
  1731. X
  1732. X    param->index = index;
  1733. X    *switches = 0;
  1734. X    return(0);
  1735. X
  1736. X}   /* end of get_switches() */
  1737. X
  1738. X/* vi: set tabstop=4 shiftwidth=4: */
  1739. X/* end of esdutil.c */
  1740. SHAR_EOF
  1741. $TOUCH -am 1224223790 'esdutil.c' &&
  1742. chmod 0644 esdutil.c ||
  1743. echo 'restore of esdutil.c failed'
  1744. Wc_c="`wc -c < 'esdutil.c'`"
  1745. test 17780 -eq "$Wc_c" ||
  1746.     echo 'esdutil.c: original size 17780, current size' "$Wc_c"
  1747. # ============= esiointf.c ==============
  1748. echo 'x - extracting esiointf.c (Text)'
  1749. sed 's/^X//' << 'SHAR_EOF' > 'esiointf.c' &&
  1750. X/*+-------------------------------------------------------------------------
  1751. X    esiointf.c - esio/FAS interface
  1752. X    wht@n4hgf.Mt-Park.GA.US
  1753. X
  1754. X  Defined functions:
  1755. X    pcmd_esio(param)
  1756. X    display_esio(sip)
  1757. X    icmd_esio(narg,arg)
  1758. X    ier_text(ier)
  1759. X    lcr_text(lcr)
  1760. X    mcr_text(mcr)
  1761. X    msr_text(msr)
  1762. X
  1763. X--------------------------------------------------------------------------*/
  1764. X/*+:EDITS:*/
  1765. X/*:12-24-1990-00:51-wht-creation */
  1766. X
  1767. X#if    defined(ESIO_IN_USE)
  1768. X#ifndef WHT
  1769. X#define WHT
  1770. X#endif
  1771. X#include "ecu.h"
  1772. X#include "ecuerror.h"
  1773. X#include "esd.h"
  1774. X#include <local/esio.h>
  1775. X
  1776. Xextern int proctrace;
  1777. X
  1778. X/*+-------------------------------------------------------------------------
  1779. X    msr_text(msr)
  1780. X--------------------------------------------------------------------------*/
  1781. Xchar *
  1782. Xmsr_text(msr)
  1783. Xuchar msr;
  1784. X{
  1785. Xstatic char txt[50];
  1786. X
  1787. X    txt[0] = '*';
  1788. X    txt[1] = 0;
  1789. X    if(!msr)
  1790. X    {
  1791. X        strcat(txt,"NULL*");
  1792. X        return(txt);
  1793. X    }
  1794. X    if(msr & MS_CTS_DELTA) strcat(txt,"dCTS*");
  1795. X    if(msr & MS_DSR_DELTA) strcat(txt,"dDSR*");
  1796. X    if(msr & MS_RING_TEDGE) strcat(txt,"dRI*");
  1797. X    if(msr & MS_DCD_DELTA) strcat(txt,"dDCD*");
  1798. X    if(msr & MS_CTS_PRESENT) strcat(txt,"CTS*");
  1799. X    if(msr & MS_DSR_PRESENT) strcat(txt,"DSR*");
  1800. X    if(msr & MS_RING_PRESENT) strcat(txt,"RING*");
  1801. X    if(msr & MS_DCD_PRESENT) strcat(txt,"DCD*");
  1802. X    return(txt);
  1803. X
  1804. X}    /* end of msr_text */
  1805. X
  1806. X/*+-------------------------------------------------------------------------
  1807. X    mcr_text(mcr)
  1808. X--------------------------------------------------------------------------*/
  1809. Xchar *
  1810. Xmcr_text(mcr)
  1811. Xuchar mcr;
  1812. X{
  1813. Xstatic char txt[32];
  1814. X
  1815. X    txt[0] = '*';
  1816. X    txt[1] = 0;
  1817. X    if(!mcr)
  1818. X    {
  1819. X        strcat(txt,"NULL*");
  1820. X        return(txt);
  1821. X    }
  1822. X    if(mcr & MC_SET_DTR) strcat(txt,"DTR*");
  1823. X    if(mcr & MC_SET_RTS) strcat(txt,"RTS*");
  1824. X    if(mcr & MC_SET_OUT1) strcat(txt,"OUT1*");
  1825. X    if(mcr & MC_SET_OUT2) strcat(txt,"OUT2*");
  1826. X    if(mcr & MC_SET_LOOPBACK) strcat(txt,"LOOPBACK*");
  1827. X    return(txt);
  1828. X
  1829. X}    /* end of mcr_text */
  1830. X
  1831. X/*+-------------------------------------------------------------------------
  1832. X    lcr_text(lcr)
  1833. X--------------------------------------------------------------------------*/
  1834. Xchar *
  1835. Xlcr_text(lcr)
  1836. Xuchar lcr;
  1837. X{
  1838. Xstatic char txt[64];
  1839. X
  1840. X    sprintf(txt,"*%ddb*",(lcr & LC_WORDLEN_MASK) + 5);
  1841. X    strcat(txt,(lcr & LC_STOPBITS_LONG) ? "2" : "1");
  1842. X    strcat(txt,"sb*");
  1843. X    if(lcr & LC_ENABLE_PARITY)
  1844. X    {
  1845. X        strcat(txt,"PARITY*");
  1846. X        if(lcr & LC_STICK_PARITY)
  1847. X            strcat(txt,(lcr & LC_EVEN_PARITY) ? "MARK*" : "SPACE*");
  1848. X        else
  1849. X            strcat(txt,(lcr & LC_EVEN_PARITY) ? "EVEN*" : "ODD*" );
  1850. X    }
  1851. X    else
  1852. X        strcat(txt,"NOPAR*");
  1853. X    if(lcr & LC_SET_BREAK_LEVEL)
  1854. X        strcat(txt,"SETBREAK*");
  1855. X    if(lcr & LC_ENABLE_DIVISOR)
  1856. X        strcat(txt,"ENABDIV*");
  1857. X    return(txt);
  1858. X
  1859. X}    /* end of lcr_text */
  1860. X
  1861. X/*+-------------------------------------------------------------------------
  1862. X    ier_text(ier)
  1863. X--------------------------------------------------------------------------*/
  1864. Xchar *
  1865. Xier_text(ier)
  1866. Xuchar ier;
  1867. X{
  1868. Xstatic char txt[32];
  1869. X
  1870. X    txt[0] = '*';
  1871. X    txt[1] = 0;
  1872. X    if(!ier)
  1873. X    {
  1874. X        strcat(txt,"NULL*");
  1875. X        return(txt);
  1876. X    }
  1877. X    if(ier & IE_RECV_DATA_AVAILABLE) strcat(txt,"RDAV*");
  1878. X    if(ier & IE_XMIT_HOLDING_BUFFER_EMPTY) strcat(txt,"TBMT*");
  1879. X    if(ier & IE_LINE_STATUS) strcat(txt,"LS*");
  1880. X    if(ier & IE_MODEM_STATUS) strcat(txt,"MS*");
  1881. X    return(txt);
  1882. X
  1883. X}    /* end of ier_text */
  1884. X
  1885. X/*+-------------------------------------------------------------------------
  1886. X    display_esio(sip)
  1887. X--------------------------------------------------------------------------*/
  1888. Xvoid
  1889. Xdisplay_esio(sip)
  1890. Xstruct esio_info *sip;
  1891. X{
  1892. X
  1893. X    pprintf("base address: %04x irq=%u ",sip->uart_port_0,sip->vec);
  1894. X    pputs("device is ");
  1895. X    if(sip->device_flags.s & DF_DEVICE_IS_NS16550)
  1896. X        pputs("16550\n");
  1897. X    else if(sip->device_flags.s & DF_DEVICE_IS_I82510)
  1898. X        pputs("82510\n");
  1899. X    else
  1900. X        pputs("16450\n");
  1901. X    pprintf("MSR=%s   ",msr_text(sip->msr));
  1902. X    pprintf("MCR=%s\n",mcr_text(sip->mcr));
  1903. X    pprintf("LCR=%s   ",lcr_text(sip->lcr));
  1904. X    pprintf("IER=%s\n",ier_text(sip->ier));
  1905. X    pprintf("recv ring cnt=%4d  ",sip->recv_ring_cnt);
  1906. X    pprintf("xmit ring cnt=%4d\n",sip->xmit_ring_cnt);
  1907. X    pprintf("characters received    =%8ld\n",sip->characters_received);
  1908. X    pprintf("characters transmited  =%8ld\n",sip->characters_transmitted);
  1909. X    pprintf("modem status events    =%8ld\n",sip->modem_status_events);
  1910. X    pprintf("total interrupt entries=%8ld\n",sip->total_interrupts);
  1911. X    pprintf("overrun errors=%ld  ",sip->overrun_errors);
  1912. X    pprintf("framing errors=%ld  ",sip->framing_errors);
  1913. X    pprintf("parity errors=%ld\n",sip->parity_errors);
  1914. X    pprintf("rings detected=%ld  ",sip->rings_detected);
  1915. X    pprintf("breaks detected=%ld\n",sip->breaks_detected);
  1916. X    pprintf("xmtr flow off XON/XOFF=%ld  RTS/CTS=%ld\n",
  1917. X        sip->xmtr_sw_flow_count,sip->xmtr_hw_flow_count);
  1918. X    pprintf("rcvr flow off XON/XOFF=%ld  RTS/CTS=%ld\n",
  1919. X        sip->rcvr_sw_flow_count,sip->rcvr_hw_flow_count);
  1920. X
  1921. X}    /* end of display_esio */
  1922. X
  1923. X/*+-------------------------------------------------------------------------
  1924. X    esio_msr() - return modem status register contents
  1925. X--------------------------------------------------------------------------*/
  1926. Xuchar
  1927. Xesio_msr()
  1928. X{
  1929. Xulong ltmp;
  1930. X
  1931. X    return((uchar)ioctl(shm->Liofd,FASIOC_MCR,(char *)<mp));
  1932. X    return(ltmp);
  1933. X}    /* end of esio_msr */
  1934. X
  1935. X/*+-------------------------------------------------------------------------
  1936. X    esio_line_errors() - return UART error count
  1937. X--------------------------------------------------------------------------*/
  1938. Xulong
  1939. Xesio_line_errors()
  1940. X{
  1941. Xstruct esio_info sinfo,*sip = &sinfo;
  1942. X
  1943. X    if((ioctl(shm->Liofd,FASIOC_SIP,(char *)sip)) < 0)
  1944. X        return(0);
  1945. X    return(sip->parity_errors + sip->framing_errors + sip->overrun_errors);
  1946. X
  1947. X}    /* end of esio_line_errors */
  1948. X
  1949. X/*+-------------------------------------------------------------------------
  1950. X    esio_rings_detected() - return number of RI trailing edges
  1951. X--------------------------------------------------------------------------*/
  1952. Xulong
  1953. Xesio_rings_detected()
  1954. X{
  1955. Xstruct esio_info sinfo,*sip = &sinfo;
  1956. X
  1957. X    if((ioctl(shm->Liofd,FASIOC_SIP,(char *)sip)) < 0)
  1958. X        return(0);
  1959. X    return(sip->rings_detected);
  1960. X
  1961. X}    /* end of esio_rings_detected */
  1962. X
  1963. X/*+-------------------------------------------------------------------------
  1964. X    esio_breaks_detected() - return number of BREAKs detected
  1965. X--------------------------------------------------------------------------*/
  1966. Xulong
  1967. Xesio_breaks_detected()
  1968. X{
  1969. Xstruct esio_info sinfo,*sip = &sinfo;
  1970. X
  1971. X    if((ioctl(shm->Liofd,FASIOC_SIP,(char *)sip)) < 0)
  1972. X        return(0);
  1973. X    return(sip->breaks_detected);
  1974. X
  1975. X}    /* end of esio_breaks_detected */
  1976. X
  1977. X/*+-------------------------------------------------------------------------
  1978. X    pcmd_esio(param)
  1979. Xesio [-switches] <str-cmd>>
  1980. X
  1981. Xwhere <str-cmd> is 'd[isplay]'
  1982. X                or 'r[eset]'
  1983. X
  1984. Xesio 'd'
  1985. Xesio 'r'
  1986. X--------------------------------------------------------------------------*/
  1987. Xint
  1988. Xpcmd_esio(param)
  1989. XESD *param;
  1990. X{
  1991. Xint erc;
  1992. Xchar switches[8];
  1993. XESD *tesd = (ESD *)0;
  1994. Xchar *cmd;
  1995. Xstruct esio_info sinfo,*sip = &sinfo;
  1996. X
  1997. X    get_switches(param,switches,sizeof(switches));
  1998. X    if(!(tesd = make_esd(64)))
  1999. X        return(eNoMemory);
  2000. X    if(!(erc = gstr(param,tesd,1)))
  2001. X    {
  2002. X        skip_cmd_break(tesd);
  2003. X        switch(to_lower(*(tesd->pb + tesd->index)))
  2004. X        {
  2005. X            case 'd':    /* display */
  2006. X                if((ioctl(shm->Liofd,FASIOC_SIP,(char *)sip)) < 0)
  2007. X                {
  2008. X                    pperror("ioctl FASIOC_SIP");
  2009. X                    erc = eFATAL_ALREADY;
  2010. X                }
  2011. X                else
  2012. X                    display_esio(sip);
  2013. X                break;
  2014. X
  2015. X            case 'r':    /* reset */
  2016. X                if((ioctl(shm->Liofd,FASIOC_RESET_STAT,(char *)0)) < 0)
  2017. X                {
  2018. X                    pperror("ioctl FASIOC_RESET_STAT");
  2019. X                    erc = eFATAL_ALREADY;
  2020. X                }
  2021. X                else if(proctrace)
  2022. X                    pputs("statistics reset\n");
  2023. X                break;
  2024. X
  2025. X            default:
  2026. X                pputs("invalid subcommand '");
  2027. X                pputs(tesd->pb);
  2028. X                pputs("'\n");
  2029. X                erc = eFATAL_ALREADY;
  2030. X                break;
  2031. X        }
  2032. X    }
  2033. X
  2034. X    if(tesd)
  2035. X        free_esd(tesd);
  2036. X    return(erc);
  2037. X
  2038. X}    /* end of pcmd_esio */
  2039. X
  2040. X/*+-------------------------------------------------------------------------
  2041. X    icmd_esio(narg,arg)
  2042. X--------------------------------------------------------------------------*/
  2043. Xvoid
  2044. Xicmd_esio(narg,arg)
  2045. Xint narg;
  2046. Xchar **arg;
  2047. X{
  2048. Xstruct esio_info sinfo,*sip = &sinfo;
  2049. X
  2050. X    if((narg > 1) && (to_lower(*arg[1]) == 'r'))
  2051. X    {
  2052. X        if((ioctl(shm->Liofd,FASIOC_RESET_STAT,(char *)0)) < 0)
  2053. X        {
  2054. X            pperror("   ioctl FASIOC_RESET_STAT");
  2055. X            return;
  2056. X        }
  2057. X        ff(se,"  esio statistics reset\r\n");
  2058. X    }
  2059. X    else
  2060. X    {
  2061. X        if((ioctl(shm->Liofd,FASIOC_SIP,(char *)sip)) < 0)
  2062. X        {
  2063. X            pperror("   ioctl FASIOC_SIP");
  2064. X            return;
  2065. X        }
  2066. X        ff(se,"\r\n");
  2067. X        display_esio(sip);
  2068. X    }
  2069. X
  2070. X}    /* end of icmd_esio */
  2071. X
  2072. X#endif /* ESIO_IN_USE */
  2073. X
  2074. X/* vi: set tabstop=4 shiftwidth=4: */
  2075. X/* end of esiointf.c */
  2076. SHAR_EOF
  2077. $TOUCH -am 1226024490 'esiointf.c' &&
  2078. chmod 0644 esiointf.c ||
  2079. echo 'restore of esiointf.c failed'
  2080. Wc_c="`wc -c < 'esiointf.c'`"
  2081. test 8287 -eq "$Wc_c" ||
  2082.     echo 'esiointf.c: original size 8287, current size' "$Wc_c"
  2083. true || echo 'restore of expresp.c failed'
  2084. echo End of part 10, continue with part 11
  2085. exit 0
  2086. --------------------------------------------------------------------
  2087. Warren Tucker, TuckerWare emory!n4hgf!wht or wht@n4hgf.Mt-Park.GA.US
  2088. Hacker Extraordinaire  d' async PADs,  pods,  proteins and protocols
  2089.  
  2090. exit 0 # Just in case...
  2091. -- 
  2092. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  2093. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  2094. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  2095. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  2096.